﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports System.Threading
Imports Commander_Wars.Spieletools
Public Class ObjektLadebildschirm
    Inherits ObjektFormMenue

    Const AnzeigeTextDauer As Long = TimeSpan.TicksPerSecond * 10
    Const MaxKOX As Integer = 5
    Dim Spielerzahl As Integer = 0

    Enum Lademodi
        Laden
        KOAuswahl
    End Enum
    Dim Lademodus As Lademodi = Lademodi.Laden
    Shared Zufallstexte As Boolean = False
    Dim LetzteAktualiesierung As Long
    Dim Duration As Long
    Dim Loadingthread As Thread
    Dim FrameTicks As Long

    Dim EinzelladeDauer As Long = 0
    Dim FertigGeladen As Boolean = False
    Dim Starten As Boolean = False
    Dim Fortschritt As Integer = 0
    Shared BeschreibungLocker As New Mutex
    Shared Beschreibung() As String = {}
    Dim Einheiten As AnimationLaufen() = {}
    Dim YMax As Integer = 0
    Dim XMax As Integer = 0
    Dim EinheitenMax As Integer = 50
    Shared Ladebalkenbreite As Integer = 0
    Shared Ladebalkenstart As Integer = 0
    Shared Text As ObjektText
    Public Pausiert As Boolean = False
    Public Shared Ladebildschirm As ObjektLadebildschirm
    Public Shared WaitForPlayersThread As Threading.Thread
    Public Shared ReadyLocker As New Mutex
    Public Shared Ready As Boolean()
    Public Shared PercentageLocker As New Mutex
    Public Shared Percentage As Integer()
    Structure KOAuswahl
        Dim KOIDS() As Integer
        Dim Spieler As Integer
        Dim KONummer As Integer
        Public Sub New(ByVal KOIDS() As Integer, ByVal Spieler As Integer, ByVal KONummer As Integer)
            Me.KOIDS = KOIDS
            Me.Spieler = Spieler
            Me.KONummer = KONummer
        End Sub
    End Structure
    ''' <summary>
    ''' Wenn true kann nur ein KO von einer Armee immer mit spielen!
    ''' </summary>
    ''' <remarks></remarks>
    Dim EinKOProArmee As Boolean = False
    Shared KOAuswahlKOS() As KOAuswahl = {}
    Dim KO As Integer = -1
    Dim KOAnzeigeTextur As Texture = Nothing
    Dim SelectedKO As Integer = -1
    Dim Spielstand As Boolean
#Region "Ladevariablen"
    Dim Name As String = ""
    Dim GesamterName As Boolean = False
    Dim Endung As String = ""
    Dim Texturenladen As Boolean = False
    Dim Updateframe As Boolean = False
#End Region
    Public Function Spielstarten() As Boolean
        Return Starten
    End Function
    Public Sub New(ByVal SpielerZahl As Integer, ByVal Beschreibung As String, ByVal Name As String, ByVal GesamterName As Boolean, ByVal Endung As String, ByVal TexturenLaden As Boolean, ByVal UpdateframeStarten As Boolean, Optional ByVal KOAuswahlKOS() As KOAuswahl = Nothing, Optional ByVal EinKOproArmee As Boolean = False, Optional ByVal Spielstand As Boolean = False)
        Hauptmenue.Pause = True
        'deactivate Cheats in Multiplayer
        If Not Hauptmenue.Connection.Connected Then
            Konsole.CheatMode = False
        End If
        Hauptmenue.EndCreatingObjects()
        While Grafikengine.IsDrawing
            Threading.Thread.Sleep(ThreadSleepTime)
        End While

        Ladebildschirm = Me
        Objektverwalter.Menue.ResetButton()
        Me.Name = Name
        Me.GesamterName = GesamterName
        Me.Endung = Endung
        Me.Texturenladen = TexturenLaden
        Me.Updateframe = Updateframe
        Me.Spielstand = Spielstand
        'Spielerzahl festlegen
        Me.Spielerzahl = SpielerZahl
        Array.Resize(Ready, SpielerZahl)
        Array.Resize(Percentage, SpielerZahl)
        'Auswahl KO's updaten!
        If KOAuswahlKOS IsNot Nothing Then
            ObjektLadebildschirm.KOAuswahlKOS = KOAuswahlKOS
        End If
        Me.EinKOProArmee = EinKOproArmee
        'Wir initialisieren alles!
        Zufallstexte = False
        Text = New ObjektText(New String() {}, 0, 0, Nothing, Schriftengine.Schriftarten.Arial, 12, FontStyle.Regular)
        SetBrechreibung(Beschreibung)
        EinzelladeDauer = DataSettings.DurchschnittlicheLadeZeit
        ObjektMaus.Visible = False

        ObjektMaus.Zustand = ObjektMaus.Zustaende.Menue
        If DataSettings.Verhaeltnis = Hauptmenue.Breitbild Then
            Objektverwalter.LoadHintergrund(DataSettings.Resourcenpfad + "Backgrounds\HM1280a800.bmp")
        Else
            Objektverwalter.LoadHintergrund(DataSettings.Resourcenpfad + "Backgrounds\HM800a600.bmp")
        End If
        Dim R As Integer
        Ladebalkenbreite = Math.DivRem(DataSettings.BildschirmBreite - 200, 127, R)
        Ladebalkenstart = 100 + R / 2
        'Die Objekte zum Handeln hinzufuegen.

        'Damit etwas passiert vorerst
        Array.Resize(Einheiten, EinheitenMax)
        YMax = Math.DivRem(DataSettings.BildschirmHoehe, 16, 0)
        XMax = Math.DivRem(DataSettings.BildschirmBreite, 16, 0)
        For I = 0 To Einheiten.Length - 1
            Dim Z As Integer = Zufallszahl(0, 12)
            Select Case Z
                Case 0
                    Einheiten(I) = New AnimationLaufen(New EinheitHoellium(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenue.AlleFarbtabellen(Zufallszahl(0, Hauptmenue.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 1
                    Einheiten(I) = New AnimationLaufen(New EinheitHoverflak(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenue.AlleFarbtabellen(Zufallszahl(0, Hauptmenue.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 2
                    Einheiten(I) = New AnimationLaufen(New EinheitAmphibienpanzer(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenue.AlleFarbtabellen(Zufallszahl(0, Hauptmenue.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 3
                    Einheiten(I) = New AnimationLaufen(New EinheitAufklaerer(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenue.AlleFarbtabellen(Zufallszahl(0, Hauptmenue.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 4
                    Einheiten(I) = New AnimationLaufen(New EinheitFlak(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenue.AlleFarbtabellen(Zufallszahl(0, Hauptmenue.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 5
                    Einheiten(I) = New AnimationLaufen(New EinheitJagdpanzer(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenue.AlleFarbtabellen(Zufallszahl(0, Hauptmenue.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 6
                    Einheiten(I) = New AnimationLaufen(New EinheitArtillerie(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenue.AlleFarbtabellen(Zufallszahl(0, Hauptmenue.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 7
                    Einheiten(I) = New AnimationLaufen(New EinheitKampfpanzer(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenue.AlleFarbtabellen(Zufallszahl(0, Hauptmenue.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 8
                    Einheiten(I) = New AnimationLaufen(New EinheitTitanpanzer(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenue.AlleFarbtabellen(Zufallszahl(0, Hauptmenue.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 9
                    Einheiten(I) = New AnimationLaufen(New EinheitMegapanzer(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenue.AlleFarbtabellen(Zufallszahl(0, Hauptmenue.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 10
                    Einheiten(I) = New AnimationLaufen(New EinheitBomber(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenue.AlleFarbtabellen(Zufallszahl(0, Hauptmenue.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 11
                    Einheiten(I) = New AnimationLaufen(New EinheitJaeger(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenue.AlleFarbtabellen(Zufallszahl(0, Hauptmenue.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 12
                    Einheiten(I) = New AnimationLaufen(New EinheitKampfpanzer(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenue.AlleFarbtabellen(Zufallszahl(0, Hauptmenue.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
            End Select
            Einheiten(I).Visible = False
        Next
        'Ab jetzt malen wir
        Loadingthread = New Thread(AddressOf Laden)
        Loadingthread.Name = "Lade Thread"
        Loadingthread.Start()


        Cursor.Hide()

        Malen()
    End Sub
    Public Shared Sub SetBrechreibung(ByVal Beschreibung As String)
        If Beschreibung Is Nothing Then Beschreibung = ""
        ObjektLadebildschirm.BeschreibungLocker.Lock()
        If Beschreibung = "Keine Beschreibung vorhanden." Or Beschreibung = "" Then
            ObjektLadebildschirm.Beschreibung = New String() {}
            ObjektLadebildschirm.Zufallstexte = True
        Else
            ObjektLadebildschirm.Beschreibung = ObjektText.getStringsZeilenweise(Beschreibung, Text.GetSchriftart, DataSettings.BildschirmBreite / 3)
            ObjektLadebildschirm.Zufallstexte = False
        End If
        ObjektLadebildschirm.BeschreibungLocker.Unlock()
    End Sub
    Public Overrides Sub Frame()

    End Sub

    Public Overrides Sub IniMenue()

    End Sub

    Public Overrides Sub KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        KeyDownObjekte(sender, e)
    End Sub
    Public Sub ButtonGeklicktLinks(ByVal Effekt As String)
        If Effekt = Nothing Then
            Exit Sub
        End If
        Select Case Effekt.ToLower
            Case "starten"
                WaitForPlayersThread = New Threading.Thread(AddressOf WaitForPlayers)
                WaitForPlayersThread.Name = "Wait for Players"
                WaitForPlayersThread.Start()
            Case "weiter"
                UpdateTexturen(1)
            Case "zurueck"
                UpdateTexturen(-1)
        End Select
    End Sub
    Private Sub WaitForPlayers()
        LoeschenButton("starten")
        LoeschenButton("weiter")
        LoeschenButton("zurueck")
        If Hauptmenue.Connection IsNot Nothing Then
            If Hauptmenue.Connection.Connected Then
                For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                    If Objektverwalter.Spielfeld.Spieler(I).KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                        ObjektLadebildschirm.ReadyLocker.Lock()
                        Ready(I - 1) = True
                        ObjektLadebildschirm.ReadyLocker.Unlock()
                        Hauptmenue.NetzBefehlSenden(Net_Orders.Game_Loaded.ToString + "|" + I.ToString)
                    End If
                Next
                While Not IsReady()
                    Threading.Thread.Sleep(ThreadSleepTime)
                End While
                Starten = True
            Else
                Starten = True
            End If
        Else
            Starten = True
        End If
    End Sub
    Private Function IsReady() As Boolean
        ObjektLadebildschirm.ReadyLocker.Lock()
        For i = 0 To Ready.Length - 1
            If Not Ready(i) Then
                'Never ever forget to Unlock Stuff before using return
                ObjektLadebildschirm.ReadyLocker.Unlock()
                Return False
            End If
        Next
        ObjektLadebildschirm.ReadyLocker.Unlock()
        Return True
    End Function
    Public Overrides Sub Malen()
        Dim sngRotation As Double = 0
        Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
        FrameTicks = Now.Ticks
        Dim Updateframe As Integer = 0
        Do While Not Starten

            While Pausiert
                Threading.Thread.Sleep(ThreadSleepTime)
            End While
            Dim Ticks As Long = Now.Ticks

            Dim FT2 As Long = FrameTicks + CLng(TimeSpan.TicksPerSecond / DataSettings.SpielGeschwindigkeit)
            If FT2 > Ticks Then
                'Wir fuehren alles in der momentanen Schleife aus
                My.Application.DoEvents()
                Continue Do
            Else
                If Duration < EinzelladeDauer * Spielerzahl Then
                    Duration += (Ticks - FrameTicks)
                    Fortschritt = Duration / (EinzelladeDauer * Spielerzahl) * 100
                Else
                    Fortschritt = 100
                End If
                If Fortschritt >= 100 Then
                    If Not FertigGeladen Then
                        Fortschritt = 99
                    Else
                        Fortschritt = 100
                    End If
                End If
                FrameTicks = Now.Ticks
            End If
            'Dauer berechnen.
            For i = 0 To Fortschritt * EinheitenMax / 100 - 1
                Einheiten(i).Visible = True
            Next

            If Grafikengine.ChangeWindowState Then
                Grafikengine.SwitchScreenMode()
            End If
            If Not Grafikengine.ResizingDrawBreak Then
                If Grafikengine.Grafikkarte Is Nothing Then Exit Do
                If Not Hauptmenue.MainMenue.Created Then Exit Do

                If Grafikengine.DeviceLost Then
                    Grafikengine.AttemptRecovery() ' this is obvious, isn't it?
                End If
                If Grafikengine.DeviceLost Then Continue Do
                Grafikengine.CreateFrustumPlanes()

                'Update Server
                If Hauptmenue.Connection IsNot Nothing Then
                    Hauptmenue.Connection.Update()
                End If
                If Hauptmenue.Lobby IsNot Nothing Then
                    Hauptmenue.Lobby.Connection.Update()
                    Hauptmenue.Lobby.SendLobbyUpdate()
                End If

                Grafikengine.IsDrawing = True
                'Bildschirm saeubern
                Grafikengine.Grafikkarte.Clear(ClearFlags.Target, System.Drawing.Color.Black, 1.0F, 0)
                'Szene beginnen
                Grafikengine.Grafikkarte.BeginScene()
                'wir teilen dem DirectX mit das wir nun 2D-Bilder zeichnen moechten
                Grafikengine.Sprite.Begin(SpriteFlags.AlphaBlend)
                'Malen
                Objektverwalter.VorHinBildmalen(Objektverwalter.texturHintergrungBild, True)

                For I = 0 To Einheiten.Length - 1
                    If Einheiten(I).Laufen = True Then
                        NextZufallsWeg(I)
                    End If
                    Einheiten(I).Einheitmalen()
                Next

                'Denn Ladebalken malen

                Grafikengine.recBild = Nothing
                Grafikengine.szfScale = Nothing
                Grafikengine.ptfRotCenter = Nothing
                'Hinten
                Grafikengine.ptfPosition = New Point(Ladebalkenstart, DataSettings.BildschirmHoehe - 150)
                For I = 0 To Ladebalkenbreite - 1
                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetBalken(False), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.ptfPosition.X += 127
                Next
                Dim XMax As Integer = Fortschritt / 100 * Ladebalkenbreite * 127
                Dim Pos As New Point(Ladebalkenstart, DataSettings.BildschirmHoehe - 150)
                For I = 0 To Ladebalkenbreite - 1
                    If XMax > 127 Then
                        Grafikengine.fillRect(New Rectangle(Pos.X, Pos.Y, 127, 9), Color.Green)
                    Else
                        Grafikengine.fillRect(New Rectangle(Pos.X, Pos.Y, XMax, 9), Color.Green)
                    End If
                    XMax -= 127
                    Pos.X += 127
                    If XMax < 0 Then
                        Exit For
                    End If
                Next
                'Vorne
                Grafikengine.recBild = Nothing
                Grafikengine.szfScale = Nothing
                Grafikengine.ptfRotCenter = Nothing
                Grafikengine.ptfPosition = New Point(Ladebalkenstart, DataSettings.BildschirmHoehe - 150)
                For I = 0 To Ladebalkenbreite - 1
                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetBalken(True), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.ptfPosition.X += 127
                Next
                'Den Fortschritt anzeigen
                ObjektAlphabet.DrawString(Fortschritt.ToString + " %", 1, New Point(DataSettings.BildschirmBreite / 2 - 20, DataSettings.BildschirmHoehe - 180), 0)
                'A Network Game Hurray.
                If Hauptmenue.Connection IsNot Nothing Then
                    If Hauptmenue.Connection.Connected Then
                        Dim StartX As Integer = DataSettings.BildschirmBreite - 80
                        Dim StartY As Integer = 60
                        Updateframe += 1
                        If Updateframe > 10 Then
                            If Objektverwalter.Spielfeld IsNot Nothing Then
                                For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                                    If Objektverwalter.Spielfeld.Spieler(I).KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                                        Percentage(I - 1) = Fortschritt
                                        Hauptmenue.NetzBefehlSendenLadeBildschirmFortschritt(I, Fortschritt)
                                    End If
                                Next
                            End If
                            Updateframe = 0
                        End If
                        For I = 0 To Percentage.Length - 1
                            Dim C As Color = Color.Red
                            If Objektverwalter.Spielfeld IsNot Nothing Then
                                C = Objektverwalter.Spielfeld.Spieler(I + 1).Farbe
                            End If
                            Grafikengine.fillRect(New Rectangle(StartX, StartY, 1, 20), Color.Black)
                            Grafikengine.fillRect(New Rectangle(StartX, StartY, 75, 1), Color.Black)
                            Grafikengine.fillRect(New Rectangle(StartX + 74, StartY, 1, 20), Color.Black)
                            Grafikengine.fillRect(New Rectangle(StartX, StartY + 19, 75, 1), Color.Black)
                            Grafikengine.fillRect(New Rectangle(StartX + 1, StartY + 1, 73 * Percentage(I) / 100, 18), C)

                            ObjektAlphabet.DrawString(Percentage(I).ToString + " %", 1, New Point(StartX + 22, StartY + 1), 1)
                            StartY += 30
                        Next
                    End If
                End If
                'So einen bloeden Tipp anzeigen.
                Grafikengine.recBild = Nothing
                Grafikengine.ptfRotCenter = Nothing
                With Grafikengine.szfScale
                    .Width = DataSettings.BildschirmBreite / 3 + 10
                    .Height = 25 * Beschreibung.Length
                End With
                Grafikengine.ptfPosition = New Drawing.Point(DataSettings.BildschirmBreite / 3 - 5, 195)
                Grafikengine.Sprite.Draw2D(TexturenHalter.GetBoxHintergrund(1), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Text.neuerText(ObjektLadebildschirm.Beschreibung, DataSettings.BildschirmBreite / 3, 200, Nothing)

                Schriftengine.DrawText(Text, New Point)

                If FertigGeladen Then
                    Dim Y As Integer = 20
                    For Each Spieler In Objektverwalter.Spielfeld.Spieler
                        If Spieler.Spieler > 0 Then
                            Dim X As Integer = 20
                            For Each MomKO In Spieler.KOS
                                If MomKO IsNot Nothing Then
                                    MomKO.KOGesichtsausdruckMalen(0, X, Y)
                                    X += 56
                                End If
                            Next
                            Y += 56
                        End If
                    Next
                End If
                If Lademodus = Lademodi.KOAuswahl Then
                    Dim Z As Integer = 0
                    Grafikengine.ptfPosition = New Point(DataSettings.BildschirmBreite / 2 - 156, DataSettings.BildschirmHoehe / 2 - 110)
                    Dim XZaehler As Integer = 0
                    For Each ID In KOAuswahlKOS(KO).KOIDS
                        intColor = Color.FromArgb(180, 255, 255, 255)
                        Grafikengine.ptfRotCenter = Nothing
                        Grafikengine.szfScale = Nothing
                        Grafikengine.recBild = Nothing
                        Grafikengine.Sprite.Draw2D(KOAnzeigeTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                        intColor = Color.FromArgb(255, 255, 255, 255)
                        Objektverwalter.GetKO(ID).KOGesichtsausdruckMalen(0, Grafikengine.ptfPosition.X, Grafikengine.ptfPosition.Y)
                        If Z = SelectedKO Then
                            Grafikengine.recBild = Nothing
                            Grafikengine.Sprite.Draw2D(KOAnzeigeTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                        End If
                        XZaehler += 1
                        Z += 1
                        If XZaehler > MaxKOX Then
                            XZaehler = 0
                            Grafikengine.ptfPosition.X = DataSettings.BildschirmBreite / 2 - 156
                            Grafikengine.ptfPosition.Y += 52
                        Else
                            Grafikengine.ptfPosition.X += 56
                        End If
                    Next
                End If
                MyBase.ObjekteMalen()
                ObjektMaus.Malen()

                Konsole.Malen()

                Grafikengine.Sprite.End()
                'Szene beenden
                Grafikengine.Grafikkarte.EndScene()
                'Szene praesentieren
                Try
                    Grafikengine.Grafikkarte.Present()    'draw device contents to screen
                Catch e As DeviceLostException
                    'AAACK! We lost the device!
                    Grafikengine.DeviceLost = True
                End Try

                Grafikengine.IsDrawing = False
            End If
            If Zufallstexte Then
                If LetzteAktualiesierung + AnzeigeTextDauer < Now.Ticks Then
                    ObjektLadebildschirm.SetBrechreibung(Sprachconverter.GetRandomLadetext)
                    LetzteAktualiesierung = Now.Ticks
                End If
            End If

            My.Application.DoEvents()
        Loop
        If ObjektLadebildschirm.Ladebildschirm IsNot Nothing Then
            ObjektLadebildschirm.Ladebildschirm.RemoveHandles()
        End If
    End Sub
    Private Sub NextZufallsWeg(ByVal E As Integer)
        Dim WX(3) As Integer
        Dim WY(3) As Integer

        WX(3) = Einheiten(E).Position.X
        WY(3) = Einheiten(E).Position.Y
        For I = 0 To 2
            If Zufallszahl(1, 100) > 50 Then
                WX(2 - I) = Zufallszahl(0, XMax)
                WY(2 - I) = WY(3 - I)
            Else
                WX(2 - I) = WX(3 - I)
                WY(2 - I) = Zufallszahl(0, YMax)
            End If
        Next
        Einheiten(E).NeuerWeg(WX, WY)
    End Sub
    Public Overrides Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Select Case e.Button
            Case Windows.Forms.MouseButtons.Left
                If SelectedKO >= 0 Then
                    Objektverwalter.Spielfeld.Spieler(KOAuswahlKOS(KO).Spieler).KOS(KOAuswahlKOS(KO).KONummer) = ObjektLadeklasse.NewKO(Objektverwalter.GetKO(KOAuswahlKOS(KO).KOIDS(SelectedKO)).KOID, KOAuswahlKOS(KO).Spieler)
                End If
                checkMouseDownObjekte(e.X, e.Y)
        End Select
    End Sub

    Public Overrides Sub MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        MouseMoveObjekte(ObjektMaus.XKoordinate, ObjektMaus.YKoordinate)
        Dim SRechteck As New Rectangle(DataSettings.BildschirmBreite / 2 - 156, DataSettings.BildschirmHoehe / 2 - 110, 48, 48)
        Dim Zaehler As Integer = 0
        If KO >= 0 Then
            For I = 0 To KOAuswahlKOS(KO).KOIDS.Length - 1

                If SRechteck.Contains(e.Location) Then
                    If SelectableKO(I) Then
                        SelectedKO = I
                        Exit For
                    End If
                End If
                Zaehler += 1
                If Zaehler > MaxKOX Then
                    Zaehler = 0
                    SRechteck.X = DataSettings.BildschirmBreite / 2 - 156
                    SRechteck.Y += 52
                Else
                    SRechteck.X += 56
                End If
                If I = KOAuswahlKOS(KO).KOIDS.Length - 1 Then
                    SelectedKO = -1
                End If
            Next
        End If
    End Sub
    Private Function SelectableKO(ByVal KOID As Integer) As Boolean
        If EinKOProArmee Then
            Dim Armys As Stack(Of String) = New Stack(Of String)
            For Each Spieler In Objektverwalter.Spielfeld.Spieler
                If Spieler.Spieler > 0 Then
                    For Each MomKO In Spieler.KOS
                        If MomKO IsNot Nothing Then
                            If Not Armys.Contains(MomKO.Armee) Then
                                Armys.Push(MomKO.Armee)
                            End If
                        End If
                    Next
                End If
            Next
            If Armys.Contains(Objektverwalter.GetKO(KOID).KOID) Then
                Return False
            End If
        End If
        Return True
    End Function
    Public Overrides Sub MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Select Case e.Button
            Case Windows.Forms.MouseButtons.Left
                ButtonGeklicktLinks(checkMouseUPObjekte(ObjektMaus.XKoordinate, ObjektMaus.YKoordinate))
        End Select
    End Sub

    Public Overrides Sub MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)

    End Sub
    Public Overrides Sub SetMausBild()
        ObjektMaus.Zustand = ObjektMaus.Zustaende.Menue
    End Sub
    Public Overrides Sub SprachEingabe(ByVal Eingabe As String)

    End Sub
    Public Sub SpielFertigGeladen()
        Pausiert = True
        While Grafikengine.IsDrawing
            Threading.Thread.Sleep(ThreadSleepTime)
        End While
        Fortschritt = 100
        Duration = EinzelladeDauer * Spielerzahl + 10
        ObjektMaus.Visible = True


        If KOAuswahlKOS.Length > 0 Then
            UpdateTexturen(0)
            KO = 0
            NeuButton(DataSettings.BildschirmBreite / 2 + 60, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Weiter", New PointF(0.5#, 1))
            NeuButton(DataSettings.BildschirmBreite / 2 - 164, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Zurueck", New PointF(0.5#, 1))
            Lademodus = Lademodi.KOAuswahl
        End If
        NeuButton(DataSettings.BildschirmBreite / 2 - 52, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Starten", New PointF(0.5#, 1))

        FertigGeladen = True
        Pausiert = False
    End Sub
    Private Sub UpdateTexturen(ByVal KOAenderung As Integer)
        KO += KOAenderung
        If KO < 0 Then KO = 0
        If KO >= KOAuswahlKOS.Length Then KO = KOAuswahlKOS.Length - 1
        KOAnzeigeTextur = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Kartenauswahl\KOAnzeigeCursor.png"), Hauptmenue.Farbtabelleerstellen(Objektverwalter.Spielfeld.Spieler(KOAuswahlKOS(KO).Spieler).Farbe))
    End Sub
    Public Sub RemoveHandles()
        Loadingthread.Abort()
        Loadingthread = Nothing
        Ladebildschirm = Nothing
        If KOAnzeigeTextur IsNot Nothing Then
            KOAnzeigeTextur.Dispose()
            KOAnzeigeTextur = Nothing
        End If
        ReDim KOAuswahlKOS(-1)
        Grafikengine.Grafikkarte.EvictManagedResources()
    End Sub
    Public Overrides Sub ChangeWindowSize(ByVal PosChange As System.Drawing.Point)
        MyBase.ChangeWindowSizeObjekte(PosChange)
        Dim R As Integer
        Ladebalkenbreite = Math.DivRem(DataSettings.BildschirmBreite - 200, 127, R)
        Ladebalkenstart = 100 + R / 2
        YMax = Math.DivRem(DataSettings.BildschirmHoehe, 16, 0)
        XMax = Math.DivRem(DataSettings.BildschirmBreite, 16, 0)
    End Sub
    ''' <summary>
    ''' Beendet alles!
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Close()

    End Sub
    ''' <summary>
    ''' Laedt die Karte und setzt je nach Menue noch andere Werte fest.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Laden()
        Dim Scripts() As ObjektScript = {}
        If Name.ToLower = "auto-zufallskarte" Then
            Dim M As ObjektKartenauswahlMenue = Objektverwalter.Menue
            Objektverwalter.Spielfeld = M.SpielKarten(ObjektKartenauswahlMenue.AngezeigteKarten(ObjektKartenauswahlMenue.MomentaneKarte))
        ElseIf Name.ToLower = "already load this map" Then 'Wir haben die Karte bereits geladen.
        Else

            Hauptmenue.Laden(Name, GesamterName, Endung, Texturenladen, Updateframe, Spielstand)
        End If
        If Objektverwalter.Spielfeld Is Nothing Then
            Konsole.Write("The input map wasn't found, check if the Record has the correct Map input and if the selected map is a valid Commander Wars Map")
            Ladebildschirm = Nothing
            Starten = True
            Hauptmenue.Ini(Hauptmenue.Formmodi.Hauptmenue)
            Exit Sub
        End If
        If TypeOf Objektverwalter.Menue Is ObjektKartenauswahlLandkartenMenue Then
            Dim M As ObjektKartenauswahlLandkartenMenue = Objektverwalter.Menue
            For I = 0 To Objektverwalter.Spielfeld.Spieler.Length - 1
                ReDim Objektverwalter.Spielfeld.Spieler(I).KOS(1)
            Next

            Dim SpielmodusGesetzt As Boolean = False
            'Ini gefaellig?
            If My.Computer.FileSystem.FileExists(M.LandkartenInfo.KampagnenOrdner + M.LandkartenInfo.Missionen(M.AusgewaehlteMission).Missionsname + ".ini") Then
                Dim ScriptDat As String = ""
                DialogTextSprachKonverter.Reset()
                Dim SofortStart As Boolean = False
                Dim strR As New IO.StreamReader(M.LandkartenInfo.KampagnenOrdner + M.LandkartenInfo.Missionen(M.AusgewaehlteMission).Missionsname + ".ini", Hauptmenue.Codierung)
                Dim Regeln As ObjektRegeln '???                 M.SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln
                Regeln = New ObjektRegeln(False, Objektverwalter.Spielfeld.Spieler.Length - 1, New ObjektRegeln.Siegbedingungen() {}, False, New Integer() {1, 0, 0, 0}, , , , , False)
                Dim NeuerModus As Boolean = False
                Dim NameSet As Boolean = False
                'Noch ein paar Standartsachen...
                While Not strR.EndOfStream
                    Dim z As String = strR.ReadLine
                    z = z.Trim
                    If z = "" Then Continue While 'Leerzeilen ignorieren
                    If z.StartsWith("'") Then Continue While 'Kommentare werden ebenfalls ignoriert. Man kann allerdings so nicht hinter eine Befehlszeile einen kommentar setzten, so wie hier :)

                    If z.StartsWith("Script:") Then ScriptDat = z.Remove(0, z.IndexOf(":") + 1)
                    If Not NameSet Then
                        If z.StartsWith("Name:") Then Objektverwalter.Spielfeld.Kartenname = z.Remove(0, z.IndexOf(":") + 1)
                        Dim Languages() As String = [Enum].GetNames(Sprachen.English.GetType)
                        If z.ToLower.StartsWith(Languages(DataSettings.Sprache).ToLower + ":") Then
                            NameSet = True
                            Objektverwalter.Spielfeld.Kartenname = z.Remove(0, z.IndexOf(":") + 1)
                        End If
                    End If
                    If z.StartsWith("Desc:") Then Objektverwalter.Spielfeld.Beschreibung = z.Remove(0, z.IndexOf(":") + 1)

                    If z.StartsWith("NaechsteKarte:") Then
                        Dim unnoetiges As String = DataSettings.Resourcenpfad + "Maps\"
                        Dim Pfad As String = M.LandkartenInfo.KampagnenOrdner
                        Pfad = Pfad.Remove(0, unnoetiges.Length)
                        If Pfad.Contains("\") Then
                            'Brauchen wir hier nicht mehr... 
                            'Pfad = Pfad.Remove(Pfad.LastIndexOf("\") + 1)
                        Else
                            'Wir sind in keinem Unterordner und alles ist in Ordnung.
                            Pfad = ""
                        End If
                        Dim Maps() As String = z.Remove(0, z.IndexOf(":") + 1).Split("|")
                        For I = 0 To Maps.Length - 1
                            If I < Maps.Length - 1 Then
                                Objektverwalter.Spielfeld.NaechsteKarte = Pfad + Maps(I) + "|"
                            Else
                                Objektverwalter.Spielfeld.NaechsteKarte = Pfad + Maps(I)
                            End If
                        Next
                    End If

                    'Set the Startplayer
                    If z.ToLower.StartsWith("startspieler=") Then
                        Regeln.Startspieler = z.Split("=")(1)
                    End If

                    If z.ToLower.StartsWith("koproarmee|") Then
                        EinKOProArmee = z.Split("|")(1)
                    End If
                    If z.ToLower.StartsWith("ko|") Then 'Ein KO soll festgelegt werden.
                        Dim s() As String = z.Split("|")

                        If s(3) = "-" Then
                            Objektverwalter.Spielfeld.Spieler(s(1)).KOS(s(2)) = Nothing 'Hier soll es keinen KO geben. geht das so oder ist Nothing nicht der richtige Befehl?
                        ElseIf s.Length > 4 Then
                            'Jetzt sollten wir irgendwie machen das man den KO auswaehlen kann
                            'Jetzt nehmen wir einfach den ersten
                            Array.Resize(KOAuswahlKOS, KOAuswahlKOS.Length + 1)
                            Dim KOIDS(s.Length - 4) As Integer
                            For I = 3 To s.Length - 1
                                For I2 = 0 To Objektverwalter.GetKOLength() - 1
                                    If Objektverwalter.GetKO(I2).KOID = s(I).ToUpper Then
                                        KOIDS(I - 3) = I2
                                        Exit For
                                    End If
                                Next
                            Next
                            KOAuswahlKOS(KOAuswahlKOS.Length - 1) = New KOAuswahl(KOIDS, s(1), s(2))
                            Objektverwalter.Spielfeld.Spieler(s(1)).KOS(s(2)) = ObjektLadeklasse.NewKO(s(3), s(1))
                        Else
                            Objektverwalter.Spielfeld.Spieler(s(1)).KOS(s(2)) = ObjektLadeklasse.NewKO(s(3), s(1))
                        End If
                        If s(2) = 0 Then
                            Objektverwalter.Spielfeld.Spieler(s(1)).Armee = Objektverwalter.Spielfeld.Spieler(s(1)).KOS(0).Armee
                        End If
                    End If
                    If z.StartsWith("Team|") Then
                        Dim s() As String = z.Split("|")
                        Objektverwalter.Spielfeld.Spieler(s(1)).Team = s(2)
                    End If
                    If z.StartsWith("KI|") Then
                        Dim s() As String = z.Split("|")
                        Objektverwalter.Spielfeld.Spieler(s(1)).KIStufe = CInt(s(2)).ToString
                    End If
                    If z.StartsWith("Farbe|") Then
                        Dim s() As String = z.Split("|")
                        If s(2).EndsWith(".bmp") Then
                            Objektverwalter.Spielfeld.Spieler(s(1)).Farbe = Hauptmenue.CStringColor(s(2))
                        Else
                            Objektverwalter.Spielfeld.Spieler(s(1)).Farbe = Color.FromArgb(CInt(s(2)))
                        End If
                    End If
                    If z.StartsWith("StartGeld|") Then
                        Dim s() As String = z.Split("|")
                        Objektverwalter.Spielfeld.Spieler(s(1)).SetFonds(s(2))
                    End If
                    If z.ToLower.StartsWith("FondsPS|".ToLower) Then
                        Dim s() As String = z.Split("|")
                        Objektverwalter.Spielfeld.Spieler(s(1)).FondsproStadt = s(2)
                    End If
                    If z.ToLower.StartsWith("FondsPF|".ToLower) Then
                        Dim s() As String = z.Split("|")
                        Objektverwalter.Spielfeld.Spieler(s(1)).Fabrikfonds = s(2)
                    End If

                    If z.ToLower.StartsWith("bauliste|") Then
                        Dim s As String() = z.Split("|")
                        Dim Bauliste As Baulisten = CInt(s(2))
                        If s(1) = 0 Then
                            For i = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                                Objektverwalter.Spielfeld.Spieler(i).SetBauliste(New Bauliste(ObjektLadeklasse.GetBauliste(Bauliste)))
                            Next
                        Else
                            Objektverwalter.Spielfeld.Spieler(s(1)).SetBauliste(New Bauliste(ObjektLadeklasse.GetBauliste(Bauliste)))
                        End If
                    End If
                    'Wir setzen die Bauprioriaeten
                    If z.ToLower.StartsWith("bauprioritaeten|") Then
                        Dim s As String() = z.Split("|")
                        If s(1) = 0 Then
                            For i = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                                Objektverwalter.Spielfeld.Spieler(i).Bauprioritaeten = New KIGenerellerSuperBau.PrioritaetsBau(s(2), s(3), s(4), s(5), s(6), s(7), s(8), s(9), s(10), False)
                            Next
                        Else
                            Objektverwalter.Spielfeld.Spieler(s(1)).Bauprioritaeten = New KIGenerellerSuperBau.PrioritaetsBau(s(2), s(3), s(4), s(5), s(6), s(7), s(8), s(9), s(10), False)
                        End If
                    End If

                    'Alles mit den Regeln.
                    If z.ToLower.StartsWith("siegbedingungen|") Then
                        Dim s() As String = z.Split("|")
                        Select Case s(1).ToLower
                            Case "aus", "off"
                                Array.Resize(Regeln.StandartSiegbedingungen, 0)
                                ReDim Regeln.Besiegbar(-1, -1)
                            Case "hq sieg", "hqsieg"
                                Regeln.SiegBedingungHinzufuegen(ObjektRegeln.Siegbedingungen.KeineHQs, Objektverwalter.Spielfeld.Spieler.Length - 1)
                            Case "einheiten sieg", "einheitensieg"
                                Regeln.SiegBedingungHinzufuegen(ObjektRegeln.Siegbedingungen.KeineEinheiten, Objektverwalter.Spielfeld.Spieler.Length - 1)
                            Case "besetzung sieg", "besetzungsieg"
                                Regeln.SiegBedingungHinzufuegen(ObjektRegeln.Siegbedingungen.Besetzungen, Objektverwalter.Spielfeld.Spieler.Length - 1, s(2))
                            Case "zeit sieg", "zeitsieg"
                                Regeln.SiegBedingungHinzufuegen(ObjektRegeln.Siegbedingungen.Zeit, Objektverwalter.Spielfeld.Spieler.Length - 1, s(2))
                        End Select
                    End If

                    If z.ToLower.StartsWith("unbesiegbar|") Then
                        Regeln.AddUnbesiegbar(z.Split("|")(1))
                    End If

                    If z.ToLower = "SofortStart=1".ToLower Then SofortStart = True
                    If z.ToLower = "SofortStart=0".ToLower Then SofortStart = False

                    If z.ToLower = "ZufallsWetter=1".ToLower Then Regeln.Zufallswetter = True
                    If z.ToLower = "ZufallsWetter=0".ToLower Then Regeln.Zufallswetter = False

                    If z.ToLower = "baublockade=1" Then Regeln.BauBlockade = True
                    If z.ToLower = "baublockade=0" Then Regeln.BauBlockade = False

                    If z.ToLower.StartsWith("teuerungsrate=") Then
                        Regeln.Teurungsrate = z.Split("=")(1)
                    End If

                    If z.ToLower.StartsWith("startwetter=") Then
                        Regeln.Standardwetter = z.Split("=")(1)
                    End If

                    If z.ToLower = "Kriegsnebel=0".ToLower Then Regeln.Nebel = Nebelarten.Aus
                    If z.ToLower = "Kriegsnebel=1".ToLower Then Regeln.Nebel = Nebelarten.Nebel
                    If z.ToLower = "Kriegsnebel=2".ToLower Then Regeln.Nebel = Nebelarten.Kriegsnebel

                    If z.ToLower = "Luftschlacht=0".ToLower Then Regeln.Luftschlacht = False
                    If z.ToLower = "Luftschlacht=1".ToLower Then Regeln.Luftschlacht = True

                    If z.ToLower = "LevelModus=0".ToLower Or z.ToLower = "Promotion=0".ToLower Then Regeln.LevelModus = False
                    If z.ToLower = "LevelModus=1".ToLower Or z.ToLower = "Promotion=1".ToLower Then Regeln.LevelModus = True

                    If z.ToLower = "DoppelGabe=0".ToLower Then Regeln.DoppelGabe = False
                    If z.ToLower = "DoppelGabe=1".ToLower Then Regeln.DoppelGabe = True

                    If z.ToLower = "GebaeudeZerstoerung=0".ToLower Then Regeln.GebaeudeZerstoerung = False
                    If z.ToLower = "GebaeudeZerstoerung=1".ToLower Then Regeln.GebaeudeZerstoerung = True

                    If z.ToLower = "Luck=0".ToLower Then Regeln.NoLuck = True
                    If z.ToLower = "Luck=1".ToLower Then Regeln.GebaeudeZerstoerung = False

                    If z.ToLower.StartsWith("TacticsDialog2:".ToLower) Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        Dim Chat As String = ""
                        For i = 5 To s.Length - 2
                            Chat += s(i) + "|"
                        Next
                        Chat += s(s.Length - 1)
                        If Regeln.SitutionsSitzung Is Nothing Then Regeln.SitutionsSitzung = New List(Of ObjektScript.EreignisDialog)
                        Regeln.SitutionsSitzung.Add(New ObjektScript.EreignisDialog(Chat, s(0), s(1), CInt(s(2)), s(3), s(4)))
                    End If

                    If z.ToLower.StartsWith("Tactics%".ToLower) Then
                        Dim s() As String = z.Split("%")
                        DialogTextSprachKonverter.SprachKonvIni.AddEintrag(s(1), s(3), s(2))
                    End If

                    If z.ToLower.StartsWith("siegbedingung=") Then
                        Regeln.Siegbedingung = z.Split("=")(1)
                    End If


                    If z.ToLower.StartsWith("AltesKOSystem".ToLower) Then
                        Regeln.KOSystem = CInt(z.Split("=")(1))
                    End If

                    If z.ToLower.StartsWith("gamemode:") Then
                        Dim GM As Integer = 0
                        If IsNumeric(z.Remove(0, z.IndexOf(":") + 1)) Then
                            GM = CInt(z.Remove(0, z.IndexOf(":") + 1)) - 1
                        Else
                            GM = [Enum].Parse(CommanderWarsGameModi.AdvanceWarsDC.GetType, z.Remove(0, z.IndexOf(":") + 1))
                        End If
                        If GM >= 0 Then
                            If GM <> DataSettings.CommanderWarsGameModus Then
                                SpielmodusGesetzt = True
                                NeuerModus = True
                                DataSettings.CommanderWarsGameModus = GM
                            End If
                        End If
                    End If


                End While
                If SpielmodusGesetzt = False Then
                    If M.LandkartenInfo.Spielmodus <> DataSettings.CommanderWarsGameModus Then
                        DataSettings.CommanderWarsGameModus = M.LandkartenInfo.Spielmodus
                    End If
                End If
                If NeuerModus Then
                    Objektverwalter.LoadNewGameModus(DataSettings.TerrainStyle)
                End If

                strR.Dispose()
                'eventuell noch das Script laden...
                If Not ScriptDat = "" Then 'Offensichtlich gibt es was..
                    ObjektScript.NeuScript(ScriptDat, False)
                    If IsNothing(Objektverwalter.Spielfeld.Scripts) Then
                        ReDim Objektverwalter.Spielfeld.Scripts(0)
                    Else
                        Array.Resize(Objektverwalter.Spielfeld.Scripts, Objektverwalter.Spielfeld.Scripts.Length + 1)
                    End If
                    Objektverwalter.Spielfeld.Scripts = ObjektScript.Scripts
                End If
                Objektverwalter.Spielfeld.Regeln = Regeln
            End If
            Objektverwalter.Spielfeld.ObjektLandkartenInfo = M.LandkartenInfo

            For I = 0 To Objektverwalter.Spielfeld.Spieler.Length - 1
                'Zufaellige KO's festlegen!
                Objektverwalter.Spielfeld.Spieler(I).KOS = ObjektKartenauswahlMenue.SelectRandomCO(Objektverwalter.Spielfeld.Spieler(I).KOS, I, Objektverwalter.Spielfeld.GetCommanderWarsModus)
                'Spieler erschaffen.
                Objektverwalter.Spielfeld.Spieler(I) = New ObjektSpieler(I, Objektverwalter.Spielfeld.Spieler(I).Farbe, Objektverwalter.Spielfeld.Spieler(I).FondsproStadt, Objektverwalter.Spielfeld.Spieler(I).KOS, Objektverwalter.Spielfeld.Spieler(I).Fonds, Objektverwalter.Spielfeld.Spieler(I).Armee, Objektverwalter.Spielfeld.Spieler(I).Team, Objektverwalter.Spielfeld.Spieler(I).GetBauliste, Objektverwalter.Spielfeld.Spieler(I).KIStufe, Objektverwalter.Spielfeld.Spieler(I).Fabrikfonds)
                If Objektverwalter.Spielfeld.Spieler(I).KOS(0) Is Nothing Then
                    Objektverwalter.Spielfeld.Spieler(I).KOS(0) = ObjektLadeklasse.NewKO("OFFIZIEROS", I)
                End If
                Objektverwalter.Spielfeld.Spieler(I).Spielername = ObjektKartenauswahlMenue.GetPlayerName(I)
            Next
        ElseIf TypeOf Objektverwalter.Menue Is ObjektKartenauswahlMenue Or TypeOf Objektverwalter.Menue Is ObjektNetzwerkMenue Then
            Dim M As ObjektKartenauswahlMenue = Objektverwalter.Menue
            'Die Scriptverweise und die Naechste Karte mituebergeben.
            Objektverwalter.Spielfeld.NaechsteKarte = M.SpielKarten(ObjektKartenauswahlMenue.MomentaneKarte).NaechsteKarte
            Objektverwalter.Spielfeld.ObjektLandkartenInfo = M.Overworld
            Objektverwalter.Spielfeld.DieseKarte = M.Kartenname(ObjektKartenauswahlMenue.MomentaneKarte)
            Objektverwalter.Spielfeld.Scripts = M.SpielKarten(ObjektKartenauswahlMenue.MomentaneKarte).Scripts
            Dim Spieler(M.Farbtabellen.Length - 1) As ObjektSpieler
            For I = 0 To M.Farbtabellen.Length - 1
                Dim neuKOS() As ObjektKO = {M.KOS(I, 0), M.KOS(I, 1)}
                'Zufaellige KO's auswaehlen!

                neuKOS = ObjektKartenauswahlMenue.SelectRandomCO(neuKOS, I, DataSettings.CommanderWarsGameModus)
                If M.KIStufen(I) = ObjektSpieler.KIStufen.Geschlossen Then
                    Spieler(I) = New ObjektSpieler(I, M.Farbtabellen(I), M.FondsproStadt(I), New ObjektKO() {New KOKeinKO(I), Nothing}, 0, Armeen.OS.ToString, "q", Nothing, ObjektSpieler.KIStufen.Geschlossen, 0)
                Else
                    Spieler(I) = New ObjektSpieler(I, M.Farbtabellen(I), M.FondsproStadt(I), neuKOS, M.Startfonds(I), neuKOS(0).Armee, M.Teams(I), M.Baulisten(I), M.KIStufen(I), M.FondsproFabrik(I))
                    Spieler(I).Bauprioritaeten = M.SpielerBauprioritaeten(I)
                End If
                If I > 0 Then
                    Spieler(I).Spielername = ObjektKartenauswahlMenue.GetPlayerName(I)
                End If
            Next
            Objektverwalter.Spielfeld.Spieler = Spieler
            Objektverwalter.Spielfeld.Scripts = M.SpielKarten(ObjektKartenauswahlMenue.AngezeigteKarten(ObjektKartenauswahlMenue.MomentaneKarte)).Scripts
            ObjektScript.Scripts = M.SpielKarten(ObjektKartenauswahlMenue.AngezeigteKarten(ObjektKartenauswahlMenue.MomentaneKarte)).Scripts
            'Wir erstellen die Regeln dieses Spiels
            Objektverwalter.Spielfeld.Regeln = M.Regeln
        ElseIf Hauptmenue.AufzeichnungLaden Then
            'eine Aufzeichnung laden
            Objektverwalter.Spielfeld.Spieler(0) = New ObjektSpieler(0, Hauptmenue.SpielerNeutral, 0, New ObjektKO() {New KOKeinKO(0), Nothing}, 0, Armeen.OS.ToString, "", Nothing, ObjektSpieler.KIStufen.Kinderleicht, 0)
            Objektverwalter.Spielfeld.Regeln = New ObjektRegeln(Hauptmenue.AufzeichnungStrR.ReadLine.Split("|"))
            For i = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                Dim Line As String = Hauptmenue.AufzeichnungStrR.ReadLine
                Dim sSp() As String = Line.Remove(0, Line.IndexOf(":") + 1).Split("|")
                Dim KO As ObjektKO = ObjektLadeklasse.NewKO(sSp(2), i)
                Dim B As Bauliste = Nothing
                If sSp(6).ToLower <> "nothing" Then
                    B = New Bauliste(sSp(6).Split("_"))
                End If
                Objektverwalter.Spielfeld.Spieler(i) = New ObjektSpieler(sSp(0), Color.FromArgb(CInt(sSp(8))), sSp(4), New ObjektKO() {KO, ObjektLadeklasse.NewKO(sSp(3), i)}, sSp(7), KO.Armee, sSp(1), B, ObjektSpieler.KIStufen.Passiv, sSp(5))
                If sSp.Length > 9 Then
                    Objektverwalter.Spielfeld.Spieler(i).Spielername = sSp(9)
                End If
            Next
        End If
        If Objektverwalter.Spielfeld.CommanderWarsModus <> DataSettings.CommanderWarsGameModus Then
            Objektverwalter.Spielfeld.CommanderWarsModus = DataSettings.CommanderWarsGameModus
        End If
        Objektverwalter.Spielfeld.NormalizeTerrain()
        If Not Zufallstexte Then
            Objektverwalter.Spielfeld.Beschreibung = ""
            For I = 0 To Beschreibung.Length - 1
                If I = Beschreibung.Length - 1 Then
                    Objektverwalter.Spielfeld.Beschreibung += Beschreibung(I)
                Else
                    Objektverwalter.Spielfeld.Beschreibung += Beschreibung(I) + " "
                End If
            Next
        End If



        Objektverwalter.ArmeeTexturenLaden(Objektverwalter.Spielfeld.Spieler)
        ObjektLadebildschirm.Ladebildschirm.SpielFertigGeladen()
    End Sub

    Public Overrides Sub KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)

    End Sub
End Class
